#ifndef __TASKQUEUE_H__
#define __TASKQUEUE_H__

#include<queue>
#include <mutex>
#include <condition_variable>
#include <functional>

using std::queue;
using std::mutex;
using std::unique_lock;
using std::condition_variable;
using std::function;

class TaskQueue
{ 
public:
	TaskQueue(size_t capacity);
	~TaskQueue();

	// 生产与消费
	void push(function<void()> && pTask);
	function<void()> pop();

	// 判空与判满
	bool empty() const;
	bool full() const;

	// 唤醒所有等待在_noteEmpty条件变量上的线程,使主线程将要退出时，子线程可以先退出来
	void wakeUp();

private:
	// 任务队列的大小
	size_t _capacity;
	// 存放任务的数据结构
	queue<function<void()>> _queue;
	// 互斥锁
	mutex _mutex;
	// 非空条件变量
	condition_variable _notEmpty;
	// 非满条件变量
	condition_variable _notFull;
	// 标识，当wakeup将所有线程唤醒时，线程可以通过标识位从while循环中退出
	bool _endFlag;
};


#endif
